package ar.edu.frba.utn.dds.Usuario;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import ar.edu.frba.utn.dds.Aerolinea.AeroLinea;
import ar.edu.frba.utn.dds.Aterrizar.Aterrizar;
import ar.edu.frba.utn.dds.Busqueda.Busqueda;
import ar.edu.frba.utn.dds.Excepciones.ConversionException;
import ar.edu.frba.utn.dds.Vuelo.Asiento;
import ar.edu.frba.utn.dds.Vuelo.Vuelo;

public class Usuario {
	private String nombre;
	private String apellido;
	private String DNI;
	private String tipoUsuario;
	private List<Search> busquedas=new ArrayList<Search>();
	private List<Asiento> asientosBusqueda;
	private BigDecimal montoCompras = BigDecimal.valueOf(0.0);
	private Perfil perfil;
	private Boolean registroBusqueda = false;
	private Busqueda busquedaAterrizar=new Busqueda();

	public Usuario(String nombre, String apellido, String DNI) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.DNI = DNI;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getDNI() {
		return DNI;
	}

	public void setDNI(String dNI) {
		DNI = dNI;
	}

	public String getTipoUsuario() {
		return tipoUsuario;
	}

	public void setTipoUsuario(String tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}

	public List<Search> getBusquedas() {
		return busquedas;
	}

	public void setBusquedas(List<Search> busquedas) {
		this.busquedas = busquedas;
	}

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public BigDecimal getMontoCompras() {
		return montoCompras;
	}

	public void setMontoCompras(BigDecimal montoCompras) {
		this.montoCompras = montoCompras;
	}

	public List<Asiento> getAsientosBusqueda() {
		return asientosBusqueda;
	}

	public void setAsientosBusqueda(List<Asiento> asientosBusqueda) {
		this.asientosBusqueda = asientosBusqueda;
	}

	public Boolean getRegistroBusqueda() {
		return registroBusqueda;
	}

	public void setRegistroBusqueda(Boolean registroBusqueda) {
		this.registroBusqueda = registroBusqueda;
	}
	
	public double montoRecargo() {
		return this.getPerfil().montoRecargo();
	}

	public Busqueda getBusquedaAterrizar() {
		return busquedaAterrizar;
	}

	public void setBusquedaAterrizar(Busqueda busquedaAterrizar) {
		this.busquedaAterrizar = busquedaAterrizar;
	}

	/**
	 * Metodo que se encarga de obtener los viajes posibles para el usuario
	 * @param origen
	 * @param fechaSalida
	 * @param horaSalida
	 * @param destino
	 * @param fechaLlegada
	 * @param horaLlegada
	 * @throws ConversionException 
	 */
	
	public void obtenerPosiblesViajes(String origen, String destino, 
			String fechaSalida, String horaSalida, 
			String fechaLlegada, String horaLlegada,Aterrizar aterrizar) throws ConversionException {
		
		Vuelo vueloDeseado = new Vuelo(origen,fechaSalida,horaSalida,
				destino,fechaLlegada,horaLlegada);
		
		if (!this.getRegistroBusqueda()){
			this.agregarHistorialBusqueda(vueloDeseado);
		}
		
		List<Asiento> asientosDisponibles = new ArrayList<Asiento>();
		Iterator<AeroLinea> aerolinea = aterrizar.getAerolineas().iterator();
		
		while (aerolinea.hasNext()){
			asientosDisponibles.addAll(busquedaAterrizar.obtenerAsientos(vueloDeseado,aerolinea.next(),this));
		}
		
		this.setAsientosBusqueda(asientosDisponibles);
		
//		this.busquedaAterrizar.setCondicionBusquedaAsiento(true);
		this.setRegistroBusqueda(false);
		
		return ;
	}
	
	/**
	 * Metodo parecido a los anteriores, pero en este caso recibe las caracteristicas de un viaje ya buscado
	 * de antemano
	 * @param viaje
	 * @param companias
	 * @throws ConversionException 
	 */
	public void obtenerPosiblesViajes(Vuelo vueloDeseado,Aterrizar aterrizar) throws ConversionException{
		this.setRegistroBusqueda(true);
		this.obtenerPosiblesViajes(vueloDeseado.getOrigen(), vueloDeseado.getFechaSalida(), 
				vueloDeseado.getHoraSalida(), vueloDeseado.getDestino(), vueloDeseado.getFechaLlegada(),
				vueloDeseado.getHoraLlegada(),aterrizar);
	}
	
	
	/**
	 * Metodo que se encagar de guardar el historial de busqueda
	 * @param viaje
	 */
	private void agregarHistorialBusqueda(Vuelo viaje){
		this.getBusquedas().add(new Search(viaje));
	}
	
//	/**
//	 * Metodo utilizado para la compra del pasaje
//	 * @param numeroDeOrdenDeListaDeBusqueda
//	 */
	public void comprarAsiento(Integer numeroDeOrdenDeListaDeBusqueda){
		Asiento asientoAComprar = this.getAsientosBusqueda().get(numeroDeOrdenDeListaDeBusqueda);
		asientoAComprar.getVuelo().getAeroLinea().getConversorAerolinea().comprar(this.getDNI(), asientoAComprar);
//		asientoAComprar.getCompania().getComprar().comprar(asientoAComprar.getCodigoAsiento());
//		asientoAComprar.getVuelo().getAeroLinea().comprar(asientoAComprar.getCodigoAsiento());
		Double precioAsientoTotal = Double.valueOf(String.valueOf(asientoAComprar.getPrecioTotal()));
		precioAsientoTotal+=+this.montoRecargo();
		this.montoCompras=BigDecimal.valueOf(precioAsientoTotal);
	}
//	
//	/**
//	 * Metodo utilizado para la reserva de un viaje
//	 * @param numeroDeOrdenDeListaDeBusqueda
//	 */
//	public void reservarAsiento(Integer numeroDeOrdenDeListaDeBusqueda){
//		Asiento asientoAReservar = this.getAsientosBusqueda().get(numeroDeOrdenDeListaDeBusqueda);
//		asientoAReservar.getVuelo().getAeroLinea().reservar(asientoAReservar.getCodigoAsiento(),this.getDNI());
//		this.montoCompras+=asientoAReservar.getPrecioTotal();
//	}
}
